有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java Swing计时器只运行一次

谁能告诉我为什么这个计时器只运行一次

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TimerTest implements ActionListener{

    private Robot r;
    private Timer t;
    private int i;

    public TimerTest(){     
        i = 0;  
        try {
            r = new Robot();
        } catch (AWTException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       
        t = new Timer(1000, this);  
        t.setRepeats(true);
        t.start();  
    }

    public static void main(String [] args){
        new TimerTest();        
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        i++;
        System.out.println("Action..." + i);        
    }

有趣的是,如果我将计时器中的延迟减少到只有100,它将按预期工作。更有趣的是,如果我删除初始化机器人的代码,它根本不工作,程序在我运行它时就终止了

我已经在Windows7和Ubuntu上试过了(虽然在Ubuntu上我根本不能使用机器人,因为我遇到了一个例外。可能是一些与权限相关的东西)


共 (2) 个答案

  1. # 1 楼答案

    请参见错误数据库中的"main exits before javax.swing.Timer's start() can start"


    评估

    当应用程序在Swing计时器启动之前退出时,所描述的行为是正确的。接下来的情况如下:

    1. 创建了摆动计时器
    2. 启动摆动计时器的单独线程。当超时通过向EDT发布InvocationEvent实例时,它将通知附加的actionListeners
    3. 主线程退出
    4. 目前,JVM中没有运行非守护进程线程。申请被终止

    ..the evaluator goes on to add..

    。。这看起来像RFE,而不是缺陷


    使其正常运行的一个可靠方法是创建一个GUI元素并显示它。这就是我之前问的原因

    ..why exactly are you creating the timer without any GUI elements? Is this for repeated screen-shots?

    为了处理这种情况,我通常会创建并显示一个框架,以允许用户配置屏幕截图的速率和面积,然后将该框架最小化,并在用户单击时开始处理:

    屏幕截图

  2. # 2 楼答案

    你的main被处理,所以程序停止。可以使用以下代码对其进行测试,将其添加到TimerTest()中

    JFrame testFrame = new JFrame();
    testFrame.setVisible(true);
    testFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    

    JFrame会让你的main不会消失,当你关闭帧时,TimerTest就会结束。你的主菜就这样结束了,主菜就这样结束了。结束程序并停止摆动计时器